﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using grupo2DEWStudio7i.Dominio;
using System.Data.SqlClient;

namespace grupo2DEWStudio7i.Persistencia.ADO

{
    public class InstrumentoDAO : IInstrumentoDAO
    {

        public Instrumento Crear(Instrumento instrumentoACrear)
        {
            if (instrumentoACrear.TipoInstru == null || instrumentoACrear.MarcaInstru == null || instrumentoACrear.ModeloInstru == null || instrumentoACrear.Caracteristicas == null)
                throw new Exception("Valor nulo");
            if (instrumentoACrear.AñoFabricacion < 1900 || instrumentoACrear.AñoFabricacion > DateTime.Now.Year)
                throw new Exception("Año no válido");
            if (instrumentoACrear.CostoxHora < 0)
                throw new Exception("Costo no válido");
            string insertar = "INSERT INTO Instrumento VALUES(@codigoi,@tipoi,@modeloi,@marcai,@añofabrii,@caraci,@costoxhorai)";
            int codnuevo = GenerarNuevoCodigo();
            using (SqlConnection conectar = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conectar.Open();
                using (SqlCommand comando = new SqlCommand(insertar, conectar))
                {
                    comando.Parameters.Add(new SqlParameter("@codigoi", codnuevo));
                    comando.Parameters.Add(new SqlParameter("@tipoi", instrumentoACrear.TipoInstru));
                    comando.Parameters.Add(new SqlParameter("@modeloi", instrumentoACrear.ModeloInstru));
                    comando.Parameters.Add(new SqlParameter("@marcai", instrumentoACrear.MarcaInstru));
                    comando.Parameters.Add(new SqlParameter("@añofabrii", instrumentoACrear.AñoFabricacion));
                    comando.Parameters.Add(new SqlParameter("@caraci", instrumentoACrear.Caracteristicas));
                    comando.Parameters.Add(new SqlParameter("@costoxhorai", instrumentoACrear.CostoxHora));
                    comando.ExecuteNonQuery();
                }
            }
            return Obtener(codnuevo);
        }

        public Instrumento Obtener(int cod)
        {
            string consulta = "SELECT * FROM Instrumento WHERE codigo=@codigoi";
            Instrumento instrumentoCreado = null;
            using (SqlConnection conectar = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conectar.Open();
                using (SqlCommand comando = new SqlCommand(consulta, conectar))
                {
                    comando.Parameters.Add(new SqlParameter("@codigoi", cod));
                    using (SqlDataReader mostrar = comando.ExecuteReader())
                    {
                        if (mostrar.Read())
                        {
                            instrumentoCreado = new Instrumento();
                            instrumentoCreado.CodInstrumento = (int)mostrar["codigo"];
                            instrumentoCreado.TipoInstru = (string)mostrar["tipo"];
                            instrumentoCreado.ModeloInstru = (string)mostrar["modelo"];
                            instrumentoCreado.MarcaInstru = (string)mostrar["marca"];
                            instrumentoCreado.AñoFabricacion = (int)mostrar["anofabri"];
                            instrumentoCreado.Caracteristicas = (string)mostrar["caracteristicas"];
                            instrumentoCreado.CostoxHora = (decimal)mostrar["costohora"];
                        }
                    }
                }
            }
            return instrumentoCreado;
        }

        public Instrumento Modificar(Instrumento instrumentoAModificar)
        {
            string consulta = @"UPDATE Instrumento SET tipo=@tipoi, modelo=@modeloi, marca=@marcai, anofabri=@añofabrii, caracteristicas=@caraci, costohora=@costoxhorai WHERE codigo=@codigoi";
            using (SqlConnection conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conexion.Open();
                using (SqlCommand comando = new SqlCommand(consulta, conexion))
                {
                    comando.Parameters.Add(new SqlParameter("@tipoi", instrumentoAModificar.TipoInstru));
                    comando.Parameters.Add(new SqlParameter("@modeloi", instrumentoAModificar.ModeloInstru));
                    comando.Parameters.Add(new SqlParameter("@marcai", instrumentoAModificar.MarcaInstru));
                    comando.Parameters.Add(new SqlParameter("@añofabrii", instrumentoAModificar.AñoFabricacion));
                    comando.Parameters.Add(new SqlParameter("@caraci", instrumentoAModificar.Caracteristicas));
                    comando.Parameters.Add(new SqlParameter("@costoxhorai", instrumentoAModificar.CostoxHora));
                    comando.Parameters.Add(new SqlParameter("@codigoi", instrumentoAModificar.CodInstrumento));
                    comando.ExecuteNonQuery();
                }
            }
            return Obtener(instrumentoAModificar.CodInstrumento);
        }

        public void Eliminar(Instrumento instrumemtoAEliminar)
        {
            string consulta = "DELETE FROM Instrumento WHERE codigo=@codigo";
            using (SqlConnection conectar = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conectar.Open();
                using (SqlCommand _Comando = new SqlCommand(consulta, conectar))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", instrumemtoAEliminar.CodInstrumento));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        public ICollection<Instrumento> ListarTodos()
        {
            string consulta = "SELECT * FROM Instrumento";
            ICollection<Instrumento> instrumentosEncontrados = new List<Instrumento>();
            Instrumento instrumentoEncontrado = null;
            using (SqlConnection conectar = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conectar.Open();
                using (SqlCommand comando = new SqlCommand(consulta, conectar))
                {
                    using (SqlDataReader Resultado = comando.ExecuteReader())
                    {
                        while (Resultado.Read())
                        {
                            instrumentoEncontrado = new Instrumento();
                            instrumentoEncontrado.CodInstrumento = (int)Resultado["codigo"];
                            instrumentoEncontrado.TipoInstru = (string)Resultado["tipo"];
                            instrumentoEncontrado.ModeloInstru = (string)Resultado["modelo"];
                            instrumentoEncontrado.ModeloInstru = (string)Resultado["modelo"];
                            instrumentoEncontrado.MarcaInstru = (string)Resultado["marca"];
                            instrumentoEncontrado.AñoFabricacion = (int)Resultado["anofabri"];
                            instrumentoEncontrado.Caracteristicas = (string)Resultado["caracteristicas"];
                            instrumentoEncontrado.CostoxHora = (decimal)Resultado["costohora"];
                            instrumentosEncontrados.Add(instrumentoEncontrado);
                        }
                    }
                }
            }
            return instrumentosEncontrados;
        }

        public ICollection<Instrumento> ListarXSala(int codigoSala)
        {
            string consulta = "SELECT Instrumento.* FROM detallesala inner join Instrumento on detallesala.codigoInstrumento = Instrumento.codigo WHERE detallesala.codigoSala=@codigoSala";
            ICollection<Instrumento> instrumentosEncontrados = new List<Instrumento>();
            Instrumento instrumentoEncontrado = null;
            using (SqlConnection conectar = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conectar.Open();
                using (SqlCommand comando = new SqlCommand(consulta, conectar))
                {
                    comando.Parameters.Add(new SqlParameter("@codigoSala", codigoSala));
                    using (SqlDataReader Resultado = comando.ExecuteReader())
                    {
                        while (Resultado.Read())
                        {
                            instrumentoEncontrado = new Instrumento();
                            instrumentoEncontrado.CodInstrumento = (int)Resultado["codigo"];
                            instrumentoEncontrado.TipoInstru = (string)Resultado["tipo"];
                            instrumentoEncontrado.ModeloInstru = (string)Resultado["modelo"];
                            instrumentoEncontrado.ModeloInstru = (string)Resultado["modelo"];
                            instrumentoEncontrado.MarcaInstru = (string)Resultado["marca"];
                            instrumentoEncontrado.AñoFabricacion = (int)Resultado["anofabri"];
                            instrumentoEncontrado.Caracteristicas = (string)Resultado["caracteristicas"];
                            instrumentoEncontrado.CostoxHora = (decimal)Resultado["costohora"];
                            instrumentosEncontrados.Add(instrumentoEncontrado);
                        }
                    }
                }
            }
            return instrumentosEncontrados;
        }

        public ICollection<Instrumento> ListarXTipo(string tipo)
        {
            string consulta = "SELECT * FROM Instrumento WHERE tipo LIKE '%'+@tipo+'%'";
            ICollection<Instrumento> instrumentosEncontrados = new List<Instrumento>();
            Instrumento instrumentoEncontrado = null;
            using (SqlConnection conectar = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                conectar.Open();
                using (SqlCommand comando = new SqlCommand(consulta, conectar))
                {
                    comando.Parameters.Add(new SqlParameter("@tipo", tipo));
                    using (SqlDataReader Resultado = comando.ExecuteReader())
                    {
                        while (Resultado.Read())
                        {
                            instrumentoEncontrado = new Instrumento();
                            instrumentoEncontrado.CodInstrumento = (int)Resultado["codigo"];
                            instrumentoEncontrado.TipoInstru = (string)Resultado["tipo"];
                            instrumentoEncontrado.ModeloInstru = (string)Resultado["modelo"];
                            instrumentoEncontrado.ModeloInstru = (string)Resultado["modelo"];
                            instrumentoEncontrado.MarcaInstru = (string)Resultado["marca"];
                            instrumentoEncontrado.AñoFabricacion = (int)Resultado["anofabri"];
                            instrumentoEncontrado.Caracteristicas= (string)Resultado["caracteristicas"];
                            instrumentoEncontrado.CostoxHora = (decimal)Resultado["costohora"];           
                            instrumentosEncontrados.Add(instrumentoEncontrado);
                        }
                    }
                }
            }
            return instrumentosEncontrados;
        }

        // Métodos de soporte
        private int GenerarNuevoCodigo()
        {
            string consulta = "SELECT max(codigo) FROM Instrumento";
            int CodigoNuevo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(consulta, _Conexion))
                {
                    object result = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(result)) // No hay datos en la tabla
                        CodigoNuevo = 1;
                    else
                        CodigoNuevo = (int)result + 1;
                }
            }
            return CodigoNuevo;
        }

    }
}